package utils

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// DateOnly 自定义日期类型，支持从字符串解析
type DateOnly time.Time

// 格式化字符串（与SQL中的TO_CHAR格式一致）
const dateLayout = "2006-01-02"

// Scan 实现sql.Scanner接口，从数据库读取时转换
func (d *DateOnly) Scan(value interface{}) error {
	if value == nil {
		return nil
	}

	switch v := value.(type) {
	case time.Time: // 直接处理 time.Time 类型
		*d = DateOnly(v)
		return nil
	case string: // 处理字符串类型
		t, err := time.Parse("2006-01-02", v)
		if err != nil {
			// 尝试带时间的格式
			t, err = time.Parse("2006-01-02 15:04:05", v)
			if err != nil {
				return err
			}
		}
		*d = DateOnly(t)
		return nil
	default:
		return fmt.Errorf("unsupported type %T for DateOnly", value)
	}
}

// Value 实现driver.Valuer接口，写入数据库时转换
func (d DateOnly) Value() (driver.Value, error) {
	return time.Time(d).Format(dateLayout), nil
}

// ToTime 可以添加辅助方法将自定义类型转换为time.Time
func (d DateOnly) ToTime() time.Time {
	return time.Time(d)
}
